/*
 * Copyright (c) 2012 SUBSECRETARIA DEFENSORIA DEL ESPACIO PUBLICO - SDEP.
 * All Rights Reserved.
 * This software is the confidential and proprietary information of SDEP
 * Developed By CONSTULT-SOFT S.A, Development Team 2012.
 *
 */
package co.gov.medellin.sdep.sisdep.domain.admin;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import co.gov.medellin.sdep.sisdep.admin.exception.SolicitudRespuestaException;
import co.gov.medellin.sdep.sisdep.admin.exception.SolicitudRespuestaRuntimeException;
import co.gov.medellin.sdep.sisdep.admin.service.ISolicitudRespuestaService;
import co.gov.medellin.sdep.sisdep.common.AppConstants;
import co.gov.medellin.sdep.sisdep.domain.MessageModalWindowController;
import co.gov.medellin.sdep.sisdep.domain.SolicitudBaseController;
import co.gov.medellin.sdep.sisdep.gestion.exception.SolicitudException;
import co.gov.medellin.sdep.sisdep.model.SolicitudRespuesta;
import co.gov.medellin.sdep.sisdep.regulacion.exception.SolicitudModificaException;

/**
 * @author Usuario
 * 
 */
public class SolicitudRespuestaController extends SolicitudBaseController implements
		Serializable {

	/**
	 * generated serial version
	 */
	private static final long serialVersionUID = -3285110767384990403L;

	/**
	 * Constructor por defecto, inicializa los elemento basicos del Controlador
	 */
	public SolicitudRespuestaController() {
		cleanSearchValues();
		cleanValues();
	}

	/** bean para el manejo del formulario de busqueda SolicitudRespuesta */
	private SolicitudRespuesta solicitudRespuestaSearch = new SolicitudRespuesta();

	/** Objeto contenedor del listado de SolicitudRespuesta luego de una consulta. */
	private DataModel solicitudRespuestaListModel;

	/** bean para el manejo del formulario de creacion/edicion. SolicitudRespuesta */
	private SolicitudRespuesta solicitudRespuesta = new SolicitudRespuesta();

	/** instancia de servicio solicitudRespuestaService */
	private ISolicitudRespuestaService solicitudRespuestaService;

	// --------------------------------------------------------------------
	// --- metodos para atender acciones init()
	// --------------------------------------------------------------------

	/**
	 * 
	 * @return String
	 * @throws SolicitudException 
	 * @throws SolicitudModificaException 
	 */
	public String initState() throws SolicitudException, SolicitudRespuestaException {
		Map params = getExternalContext().getRequestParameterMap();
		Long solicitudId = new Long((String) params.get("solicitudId"));
		String solicitudRadicado = (String) params.get("solicitudRadicado");
		this.solicitudOrigenRedirectPage = (String) params.get("solicitudOrigenRedirectPage");
		this.solicitudDestinoRedirectPage = (String) params.get("solicitudDestinoRedirectPage");
		this.solicitud = getSolicitudService().get(solicitudId.longValue());
		this.solicitudRespuestaSearch = getSolicitudRespuestaService().getSolicitudRespuestaRelatedBy(solicitudId.longValue());
		if(this.solicitudRespuestaSearch == null){
			this.solicitudRespuesta = new SolicitudRespuesta();
			this.solicitudRespuestaSearch = new SolicitudRespuesta();
			cleanSearchValues();
			cleanValues();
		}
		this.solicitudRespuesta.setIdSolicitud(solicitudId);
		this.solicitudRespuesta.setRadicado(solicitudRadicado);
		this.solicitudRespuestaSearch.setIdSolicitud(solicitudId);
		this.solicitudRespuestaSearch.setRadicado(solicitudRadicado);
		return solicitudOrigenRedirectPage;
	}

	/**
	 * 
	 * @return String
	 */
	public String searchSolicitudRespuestaByKey() {
		String msg = "";
		try {
			List valores = null;
			valores = getSolicitudRespuestaService().load(1, 10, this.solicitudRespuestaSearch);
			this.solicitudRespuestaListModel.setWrappedData(valores);
		} catch (Exception e) {
			msg = e.getMessage();
			e.printStackTrace(System.err);
		}
		if (this.solicitudRespuestaListModel.getWrappedData() == null) {
			if(msg.equals("")){
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		} else {
			if (((List) this.solicitudRespuestaListModel.getWrappedData()).isEmpty()) {
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		}
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage(msg, null, null);
		return AppConstants.SOLICITUD_RESPUESTA_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String create() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.solicitudRespuesta.getId().longValue() == 0L) {
				getSolicitudRespuestaService().insert(this.solicitudRespuesta);
				msg = AppConstants.SUCCESS_CREATE;
			}
		} catch (SolicitudRespuestaException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (SolicitudRespuestaRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		cleanValues();
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage("- Respuesta a solicitud " + msg, null, null);
		return AppConstants.SOLICITUD_RESPUESTA_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String update() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.solicitudRespuesta.getId().longValue() != 0L) {
				getSolicitudRespuestaService().update(this.solicitudRespuesta);
				msg = AppConstants.SUCCESS_UPDATE;
			}
		} catch (SolicitudRespuestaException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (SolicitudRespuestaRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		cleanValues();
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage("- Respuesta a solicitud " + msg, null, null);
		return AppConstants.SOLICITUD_RESPUESTA_SEARCH_VIEW;
	}

	// --------------------------------------------------------------------
	// --- metodos para atender acciones end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public String createSolicitudRespuesta() {
		Long solicitudId = getSolicitudRespuestaSearch().getIdSolicitud();
		String solicitudRadicado = getSolicitudRespuestaSearch().getRadicado();
		solicitudRespuesta = new SolicitudRespuesta();
		cleanValues();
		if(solicitudId != null && solicitudRadicado != null){
			this.solicitudRespuesta.setIdSolicitud(solicitudId);
			this.solicitudRespuesta.setRadicado(solicitudRadicado);
			this.solicitudRespuestaSearch.setIdSolicitud(solicitudId);
			this.solicitudRespuestaSearch.setRadicado(solicitudRadicado);
		}
		return AppConstants.SOLICITUD_RESPUESTA_CREATE_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String updateSolicitudRespuesta() {
		Map params = getExternalContext().getRequestParameterMap();
		String solicitudRespuestaDataIndex = (String) params
				.get("solicitudRespuestaDataIndex");
		this.solicitudRespuesta = (SolicitudRespuesta) ((List) this.solicitudRespuestaListModel
				.getWrappedData())
				.get(Integer.parseInt(solicitudRespuestaDataIndex));
		cleanSearchValues();
		return AppConstants.SOLICITUD_RESPUESTA_UPDATE_VIEW;
	}

	/**
	 *
	 * @return
	 */
	public String cancelSolicitudRespuesta() {
		cleanSearchValues();
		this.solicitudRespuestaListModel = new ListDataModel();
		return AppConstants.SOLICITUD_RESPUESTA_SEARCH_VIEW;
	}

	/**
	 *
	 * @return
	 */
	public String cancelSolicitudRespuestaOpcion() {
		cleanValues();
		cleanSearchValues();
		return getSolicitudDestinoRedirectPage();
	}

	/**
	 * limpia el contenido de los valores que se ingresan para buscar
	 */
	public final void cleanSearchValues(){
		solicitudRespuestaSearch.setIdSolicitud(new Long(0L));
		solicitudRespuestaSearch.setFechaMaximaRespuesta(null);
		solicitudRespuestaSearch.setFechaRespuesta(null);
		solicitudRespuestaSearch.setFechaEntrega(null);
		solicitudRespuestaSearch.setRadicadoEntrada("");
		solicitudRespuestaSearch.setRadicadoSalida("");
		solicitudRespuestaSearch.setEstado("");
	}

	/**
	 * limpia el contenido de los valores que se ingresan (Create, Update)
	 */
	public final void cleanValues(){
		solicitudRespuesta.setId(new Long(0L));
		solicitudRespuesta.setIdSolicitud(new Long(0L));
		solicitudRespuesta.setRespuesta("");
		solicitudRespuesta.setFechaMaximaRespuesta(null);
		solicitudRespuesta.setFechaRespuesta(null);
		solicitudRespuesta.setFechaEntrega(null);
		solicitudRespuesta.setObservaciones("");
		solicitudRespuesta.setEntrega("");
		solicitudRespuesta.setRadicadoEntrada("");
		solicitudRespuesta.setRadicadoSalida("");
		solicitudRespuesta.setEstado("");
		this.solicitudRespuestaListModel = new ListDataModel();
	}

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- getters and setters init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public SolicitudRespuesta getSolicitudRespuestaSearch() {
		return solicitudRespuestaSearch;
	}

	/**
	 * 
	 * @param solicitudRespuestaSearch
	 */
	public void setsolicitudRespuestaSearch(SolicitudRespuesta solicitudRespuestaSearch) {
		this.solicitudRespuestaSearch = solicitudRespuestaSearch;
	}

	/**
	 * 
	 * @return
	 */
	public DataModel getsolicitudRespuestaListModel() {
		return solicitudRespuestaListModel;
	}

	/**
	 * 
	 * @param solicitudRespuestaListModel
	 */
	public void setsolicitudRespuestaListModel(DataModel solicitudRespuestaListModel) {
		this.solicitudRespuestaListModel = solicitudRespuestaListModel;
	}

	/**
	 * 
	 * @return
	 */
	public SolicitudRespuesta getSolicitudRespuesta() {
		return solicitudRespuesta;
	}

	/**
	 * 
	 * @param solicitudRespuesta
	 */
	public void setsolicitudRespuesta(SolicitudRespuesta solicitudRespuesta) {
		this.solicitudRespuesta = solicitudRespuesta;
	}

	/**
	 * obtencion del servicio solicitudRespuestaService
	 * 
	 * @return
	 */
	public ISolicitudRespuestaService getSolicitudRespuestaService() {
		return solicitudRespuestaService;
	}

	/**
	 * establecimiento del servicio solicitudRespuestaService, la inyeccion de la
	 * dependencia la cubre SpringFramework
	 * 
	 * @param solicitudRespuestaService
	 */
	public void setSolicitudRespuestaService(
			ISolicitudRespuestaService solicitudRespuestaService) {
		this.solicitudRespuestaService = solicitudRespuestaService;
	}

	// --------------------------------------------------------------------
	// --- getters and setters end()
	// --------------------------------------------------------------------

}
